package com.microcm.system.utils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.lucene.search.IndexSearcher;

import com.microcm.system.entity.IndexSearcherUnit;

/**
 * 索引查询实例持有类，为多个并发查询请求者返回同一个查询器，并且当索引有变动时候重建IndexSearcher
 * 
 * @author kansum
 */
public class IndexSearcherHolder
{
	private static IndexSearcherHolder indexSearcherHolder = new IndexSearcherHolder();

	private Map<String, IndexSearcherUnit> indexSearcherMap = new HashMap<String, IndexSearcherUnit>();

	private IndexSearcherHolder()
	{
	}

	/**
	 * 返回单例的池对象
	 * 
	 * @author kansum
	 */
	public static IndexSearcherHolder getInstance()
	{
		return indexSearcherHolder;
	}

	/**
	 * 是否持有indexSearcher
	 * 
	 * @author kansum
	 */
	public boolean isHoldIndexSearcher(String indexName)
	{
		return this.indexSearcherMap.containsKey(indexName);
	}

	/**
	 * 将IndexSearcherUnit持有到map中
	 * 
	 * @param indexName
	 * @param indexRoot
	 * 
	 * @author kansum
	 */
	public void holdIndexSearcher(String indexName, String indexRoot)
	{
		IndexSearcherUnit indexSearcherUnit = new IndexSearcherUnit(indexRoot);
		this.indexSearcherMap.put(indexName, indexSearcherUnit);
	}

	/**
	 * 初始化并打开索引查询器
	 * 
	 * @param indexName
	 * @author kansum
	 */
	public void openIndexSearcher(String indexName) throws IOException
	{
		if (!isHoldIndexSearcher(indexName))
			return;
		IndexSearcherUnit indexSearcherUnit = this.indexSearcherMap.get(indexName);
		if (indexSearcherUnit.isSearchReady())
			return;
		indexSearcherUnit.openIndexSearcher();
	}

	/**
	 * 返回一个IndexSearcher
	 * 
	 * @param indexName
	 * @author kansum
	 * @throws IOException
	 */
	public IndexSearcher getIndexSearcher(String indexName) throws IOException
	{
		IndexSearcherUnit indexSearcherUnit = this.indexSearcherMap.get(indexName);
		return indexSearcherUnit.getIndexSearcher();
	}

	/**
	 * 关闭索引查询器以及其持有的资源
	 * 
	 * @param indexName
	 * @author kansum
	 */
	public void closeIndexSearcher(String indexName) throws IOException
	{
		if (!isHoldIndexSearcher(indexName))
			return;
		IndexSearcherUnit indexSearcherUnit = this.indexSearcherMap.get(indexName);
		indexSearcherUnit.closeIndexSearcher();
	}
}
